" echom "提示：This is general.vimrc"

"==============================================================================
"" 这个档案的双引号 (") 是批注

"==============================================================================
" 自动动作配置

	" 让配置变更立即生效 
	"autocmd BufWritePost $MYVIMRC source $MYVIMRC 

	"启动时默认自动最大化gvim窗口
	" autocmd GUIEnter * simalt ~x

	" 打开自动定位到最后编辑的位置, 需要确认.viminfo当前用户可写
	if has("autocmd")
		au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
	endif

	"关闭最后一个文件编辑buffer窗口时，自动退出其余所有NERDTree、Quickfix窗口
	" autocmd BufEnter * if 0 == len(filter(range(1, winnr('$')), 'empty(getbufvar(winbufnr(v:val), "&bt"))')) | qa! | endif

	"关闭最后一个文件编辑buffer窗口时，打开 vim-project 面板(需要安装amiorin/vim-project插件)
	"autocmd BufEnter * if 0 == len(filter(range(1, winnr('$')), 'empty(getbufvar(winbufnr(v:val), "&bt"))')) | Welcome | endif

	"关闭最后一个文件编辑buffer窗口时，打开 Startify 面板(需要安装mhinz/vim-startify插件)
	" autocmd BufEnter * if 0 == len(filter(range(1, winnr('$')), 'empty(getbufvar(winbufnr(v:val), "&bt"))')) | Startify | endif

	set autochdir     " 自动切换到当前编辑的文件所在路径 (自动切换nerdtree 不会自动切换路劲刷新，可用 NERDTreeFind 快速定位当前文件位置用NETDTree打开)
	" 手动切换到当前选中文件所在目录路径 :cd %:p:h
	
" 打开时文件权限方式（通常，您可以键入视图文件名而不是vim filename，它将以只读模式打开vim）
	"可能存在目录权限位以外的其他目录权限位，例如文件可能被锁定或只读文件系统上。会出现文件锁定情况出现只读情况无法编辑。
	set ro
	":se noro 
	":set noreadonly 
	" [如何清除vim RO标志](http://cn.voidcc.com/question/p-zouwvxdm-bdu.html)
	
" 查找时大小写敏感配置
	set ignorecase                                       " 设置默认进行大小写不敏感查找
	set smartcase                                        " 如果有一个大写字母，则切换到大小写敏感查找

    set clipboard=unnamed,unnamedplus                    " 寄存器+ *与系统剪贴板共通
" 配置多语言环境,解决中文乱码问题

	set encoding=utf-8                                   " 内部使用的字符编码方式，包括 Vim 的 buffer (缓冲区)、菜单文本、消息文本等。
	set fileencoding=utf-8                               " Vim 中当前编辑的文件的字符编码方式，Vim 保存文件时也会将文件保存为这种字符编码方式 (不管是否新文件都如此)。
	set fileencodings=utf-8,ucs-bom,gb18030,gb2312,gbk,cp936,latin1,latin-1   " Vim 启动时会按照它所列出的字符编码方式逐一探测即将打开的文件的字符编码方式，并且将 fileencoding 设置为最终探测到的字符编码方式。
	"简写
	" set fencs=utf-8,gbk,utf-16,utf-32,ucs-bom            " 编码配置
	set termencoding=utf-8                               " 该选项代表输出到客户终端（Term）采用的编码类型,默认空值，也就是输出到终端时不进行编码转换



	"解决菜单乱码问题
	source $VIMRUNTIME/delmenu.vim
	source $VIMRUNTIME/menu.vim

	language messages zh_CN.utf-8                        " vim提示信息乱码、consle输出乱码问题

	if has("multi_byte")
		" UTF-8 编码
		set encoding=utf-8
		set termencoding=utf-8
		set formatoptions+=mM
		"set fencs=utf-8,gbk
		set fencs=utf-8,gbk,utf-16,utf-32,ucs-bom "编码配置
		if v:lang =~? '^/(zh/)/|/(ja/)/|/(ko/)'
			set ambiwidth=double
		endif
		if has("win32")
			source $VIMRUNTIME/delmenu.vim
			source $VIMRUNTIME/menu.vim
			language messages zh_CN.utf-8
		endif
	else
		echoerr "Sorry, this version of (g)vim was not compiled with +multi_byte"
	endif

" 基础窗口美化设置
	set shortmess=atI              " 启动的时候不显示那个援助索马里儿童的提示`

	set number                     " 可以在每一行的最前面显示行号啦！
	set relativenumber             " 行号以相对行数显示 
	" 让第一次进入文件的时候使用绝对行号，进入编辑模式再退出到normal模式时再显示相对行号
	augroup relative_numbser
		autocmd!
		autocmd WinEnter    * :set relativenumber   " 进入窗口时
		autocmd InsertEnter * :set norelativenumber " 插入模式进入时
		autocmd InsertLeave * :set relativenumber   " 离开插入模式时
		autocmd WinLeave    * :set norelativenumber " 窗口离开时
	augroup END

	" [参考资料 自定义命令 vim 事件](http://vimcdoc.sourceforge.net/doc/autocmd.html)
		" InsertEnter   " 开始插入模式前
		" InsertLeave   " 
		" WinEnter      " 进入其它窗口后
	
	
" 基础高亮配置
	" 延时禁用让Vim查找/替换后一段时间自动取消高亮，发生查找时自动开启
	" 当光标一段时间保持不动了，就禁用高亮
	autocmd cursorhold * set nohlsearch
	" 当输入查找命令时，再启用高亮
	noremap n :set hlsearch<cr>n
	noremap N :set hlsearch<cr>N
	noremap / :set hlsearch<cr>/
	noremap ? :set hlsearch<cr>?
	noremap * *:set hlsearch<cr>

	" 最近行显示高亮配置
	set cursorline      " 高亮最近行
	set nocursorcolumn  " 不高亮最近列
	au WinLeave * set nocursorline nocursorcolumn
	au WinEnter * set cursorline cursorcolumn

	" 查找结果高亮显示设置
	" 更多的CTERM颜色可以查阅：http://vim.wikia.com/wiki/Xterm256_color_names_for_console_Vim

	" highlight Search ctermbg=yellow ctermfg=black
	" highlight IncSearch ctermbg=black ctermfg=yellow
	" highlight MatchParen cterm=underline ctermbg=NONE ctermfg=NONE

" 光标主题配置
	" 终端下这个和终端的光标设置有关，只要修改了终端中光标的显示，vim自然就修改了。
	
	" Gvim下是可以自定义的光标的形状的，具体的命令是guicursor
	set guicursor=i:ver1  " gui下插入模式光标为竖线
	set gcr=a:block-blinkon10 " 设置光标闪烁 gcr是guicursor 的简写，a 表示所有模式，冒号后面是对百应模式下的行为参数，每个参数用 - 分隔，block 说明用块状光标，blinkon 表示亮起光标时长，时长为零度表示禁用闪烁。也可以是 blinkoff0 或者 blinkwait0
	set list                      " 显示制表格^I、Windows换行符^M,Unix结尾符$ (TAB 键显示为 ^I，而 $显示在每行的结尾)
	set listchars=tab:>-,trail:-   " TAB会被显示成 ">—" 而行尾多余的空白字符显示成 "-"。
	"set nolist                    " 不显示制表格^I、结尾符$
	"set nowrap                    " 不自动换行    dont wrap lines

	" "制表符号高亮
	" highlight tabSpace term=bold ctermbg=green guibg=green
	" autocmd ColorScheme * highlight tabSpace ctermbg=green guibg=green
	" match tabSpace /\v\t+$/

	" "行尾空格高亮
	" highlight extraSpace term=bold ctermbg=yellow guibg=yellow
	" autocmd ColorScheme * highlight extraSpace ctermbg=yellow guibg=yellow
	" 2match extraSpace /\v\ +$/

	" "超长文本高亮
	" " 将一行中超过79个字的部分用蓝色字体高亮显示。
	" highlight rightMargin term=bold ctermfg=blue guifg=blue
	" autocmd ColorScheme * highlight rightMargin ctermbg=blue guibg=blue
	" 3match rightMargin /.\%>79v/
	
	" set columns=79      "  显示时 在79列进行换行展示
	set colorcolumn=79    "  在第79行显示线提示

	set wrap                      " 自动换行    dont wrap lines	
	set ruler           "打开状态栏标尺
	set showmatch       " 高亮匹配的括号

	" 设置当文件被改动时自动载入
	set autoread
	" 在处理未保存或只读文件的时候，弹出确认
	set confirm

" 关闭/开启菜单栏和工具栏
	"set guioptions-=m              " 关闭菜单栏     remove menu bar  
	"set guioptions-=T              " 关闭工具栏     remove toolbar  
	"set guioptions-=r              " 关闭右边滚动栏 remove right-hand scroll bar  
	"set guioptions-=L              " 关闭左边滚动栏 remove left-hand scroll bar
	"set guioptions+=m              " 开启菜单栏     show menu bar  
	"set guioptions+=T              " 开启工具栏     show toolbar  
	"set guioptions+=r              " 开启右边滚动栏 show right-hand scroll bar  
	"set guioptions+=L              " 开启左边滚动栏 show left-hand scroll bar

" 内在记录配置
	" 剪贴板 寄存器设置
	set clipboard^=unnamed,unnamedplus  " 其中unnamed代表*寄存器，unnamedplus代表+寄存器。在mac系统中，两者都一样；一般在linux系统中+和*是不同的，+对应ctrl + c,ctrl + v的桌面系统剪贴板，*对应x桌面系统的剪贴板（用鼠标选择复制，用鼠标中键粘贴）。
	" set clipboard=unnamed "让Vim共享系统剪切板， 就是这个原理：所有删除和拷贝操作默认都会到匿名寄存器(匿名寄存器"")。
		

	set history=1000             " 记录历史条数
	set laststatus=2             " 状态栏行数    use 2 lines for the status bar
	set backspace=2              " 允许将一行退格到上面一行的结尾

	set showcmd                    " 在状态栏显示命令状态    show typed command in status bar
	"set textwidth=79              " 文本宽度
	set wildmenu                   " 打开补全提示窗口（vim默认没打开，neovim默认打开）
	set showtabline=2              " 标签页在窗口上方显示标签栏。=0完全不显示标签栏，=1只有用户新建时才显示，=2总是显示标签栏。
	" set splitright                 " 垂直左右切分窗口时，新窗口在右方
	" set splitbelow                 " 水平上下切分时，新窗口在下方
	set noswapfile                 " 禁止vim产生交换文件
	" set nowrapscan                 " 搜索到文件两端时不重新搜索

	set mouse=a                    " 所有模式下允许使用鼠标 可以在buffer的任何地方使用鼠标（类似office中在工作区双击鼠标定位）

	set noeb                       " 这样当错误发生的时候将不会发出 bi 的一声。（ noeb 是 noerrorbells 的缩写），
	set vb                         " 代替 bell 的将是屏幕的闪烁。（ vb 是 visualbell 的缩写）
	set vb t_vb=                   " 尤其是在跟他人同住（比如学生宿舍）的时候这样的闪烁也会影响别人。
	syntax on                      " 进行语法检验，颜色显示。

	"set report=0                   " 通过使用: commands命令，告诉我们文件的哪一行被改变过
	set fillchars=vert:\ ,stl:\    " 在被分割的窗口间显示空白，便于阅读 ,stlnc:\(加了这个wm分割栏有)

	set scrolloff=3                " 光标移动到buffer的顶部和底部时保持3行距离
	set hidden                     " 允许在有未保存的修改时切换缓冲区
	
	" :browse e -- 会打开一个文件浏览器让你选择要编辑的文件。 
	"    如果是终端中，则会打开netrw的文件浏览窗口； 如果是gvim，则会打开一个图形界面的浏览窗口。 
	"    实际上:browse后可以跟任何编辑文档的命令，如sp等。 用browse打开的起始目录可以由browsedir来设置：
	"set browsedir=last      " 用上次访问过的目录（默认）；
	"set browsedir=buffer    " 用当前文件所在目录；
	set browsedir=current    " 用当前工作目录；

"设置tab键输入变为
	set tabstop=4     " 表示一个 tab 显示出来是多少个空格的长度，默认 8。是實際上讀到檔案的 \t (Tab 字元) 時，要解譯為幾個空白
	set shiftwidth=4  " 表示每一级缩进的长度，一般设置成跟 softtabstop 一样。
	set softtabstop=4 " 在編輯動作 (Backspace) 或是 (Tab) 時，對空白的解譯,修改按 Tab 键的行为，不修改 tab 字符的显示宽度。具体行为跟 tabstop 选项值有关
	"set expandtab    " 将tab转space (实际存起來的文件将会是以空格的编码不是tab的编码 )；即， 把插入的 tab 字符替换成特定数目的空格。具体空格数目跟 tabstop 选项值有关
						" 如果要將既有的 <Tab> 轉成 space 可以再 expandtab 之後輸入:retab!
	set noexpandtab

	set autoindent  " 解释：set autoindent Tab键的宽度 当设置成 expandtab 时，缩进用空格来表示，noexpandtab 则是用制表符表示一个缩进。

	" 带有如下符号的单词不要被换行分割
	set iskeyword+=_,$,@,%,#,-
	" 字符间插入的像素行数目
	set linespace=0

	let python_highlight_all = 1 " 开启对不规范的Python语法的警告提示

	" > 参考资料
	" + [vim中tabstop、shiftwidth、softtabstop以及expandtab的关系](https://blog.csdn.net/chenxiang6891/article/details/41348073)
	" + [vim技巧：详解tabstop、softtabstop、expandtab三个选项的区别](https://segmentfault.com/a/1190000021133524?utm_source=tag-newest)


" 代码折叠相关说明与配置
	"set foldmethod=indent  " 设置成 indent 折叠方式（更多的缩进表示更高级别的折叠）
	"set foldcolumn=3       " 命令定义了左折叠栏的宽度，默认是0。该栏用“|”显示折叠层次。
	"set fdm=indent        "set foldmethod=indent的简写 
	" 确认折叠功能开启:set foldenable
	" ：set fdm?      " 参考当前的折叠模式
		" vim 提供 6中折叠方式(默认省缺下为manual手工定义折叠)
		"    manual            手工定义折叠
		"    indent            更多的缩进表示更高级别的折叠
		"    expr              用表达式来定义折叠
		"    syntax            用语法高亮来定义折叠
		"    diff              对没有更改的文本进行折叠
		"    marker            对文中的标志折叠

		" manual 模式  ( 手工定义折叠 ）它的命令是通用的，掌握了manual的基本命令，折叠也就差不多
			" za    切换折叠状态，
			" zc    关闭折叠，就是折叠起来，
			" zo    打开折叠，
			" zd    删除折叠，当a、c、d、o大写时，则动作是递归的。
			" zf    创建折叠是zf结合光标移动命令（将光标放在函数的开括号上，用zf%，可方便的将函数折起来）。
			" zr    减少折叠 也就是取消折叠吧标志也取消了
			" zm    折叠更多 
			" zM    减少到一个也不剩
			" zm    折叠更多
			" 举例说明：  
				"    把光标置于某一段落内，并命令模式下键入 zfap 你将会看到该段落被一行高亮的文本所代替。你已经创建一个折叠了。 zf 是个操作符，而 ap 是一个文本对象。
				"    你可以将 zf 操作符跟任何一个移动命令联用，为所经之处的文本创建一个折叠。 (如：zf56G，创建从当前行起到56行的代码折叠；)
				"    zf 也能在可视模式下使用。


		" indent 模式  ( 更多的缩进表示更高级别的折叠 ）
			"    zi      打开/关闭折叠
			"    zc      折叠
			"    zC      对所在范围内所有嵌套的折叠点进行折叠
			"    zo      展开折叠
			"    zO      对所在范围内所有嵌套的折叠点展开
			"    [z      到当前打开的折叠的开始处。
			"    ]z      到当前打开的折叠的末尾处。
			"    zj      向下移动。到达下一个折叠的开始处。关闭的折叠也被计入。
			"    zk      向上移动到前一折叠的结束处。关闭的折叠也被计入。
			"    注：使用时在缩进处输入命令，缩进处需要四个空格或一个Tab键的长度

		" marker模式    
			"需要用标计来标识代码的折叠，系统默认是{{{和}}}，最好不要改动之
			" zf  创建折叠，比如在marker方式下：
			"        zf56G，创建从当前行起到56行的代码折叠；
			"        10zf或10zf+或zf10↓，创建从当前行起到后10行的代码折叠。
			"        10zf-或zf10↑，创建从当前行起到之前10行的代码折叠。
			"        在括号处zf%，创建从当前行起到对应的匹配的括号上去（（），{}，[]，等）。
			" zd  删除 (delete) 在光标下的折叠。仅当 'foldmethod' 设为 "manual" 或 "marker" 时有效。
			" zD  循环删除 (Delete) 光标下的折叠，即嵌套删除折叠。
			"     仅当 'foldmethod' 设为 "manual" 或 "marker" 时有效。
			" zE  除去 (Eliminate) 窗口里“所有”的折叠。
			"     仅当 'foldmethod' 设为 "manual" 或 "marker" 时有效。

		" vim提供4种缩排，:set indenttype? (查看当前缩排)
		" indenttyep可为:
			" autoindent
			" smartindent
			" cindent
			" indentexpr
			" 其中，autoindent与vi的autoindent类似，smartindent则是对其做了点加强，

	" 注意，每一种折叠方式不兼容，即：你不能用expr又用marker方式。
	" > 参考资料
	" + [Vim 折叠](https://www.jianshu.com/p/16e0b822b682)
	" + [vim 中代码的折叠和打开](https://blog.csdn.net/woshicsdn7547/article/details/45364047)
	" + [vim的折叠、智慧缩排](https://blog.csdn.net/strategycn/article/details/7897895)

	" 多窗口同步滚动
		" 关键命令就是: set scrollbind, 当然这两个窗口都要设置下的，哪几个窗口要同步滚动呢
		" 如果要取消同步滚动，要执行: set noscrollbind

"===============================================================================
